def default_format_fun(field, field_dict):
    """
    默认的格式化函数
    """
    return field_dict[field.name]


class ExportField:
    """
    表结构字段导出规则
    name:表字段名
    c_name:自定义的表字段中文名，未指定时将使用默认，例如name=type,c_name=参数类型，生产的表头为“参数类型”
    format_fun:格式化函数，这个字段如何进行显示，接收两个参数，一个是当前对象，一个是实际的数据字典，
            example:默认是将【类型】和【长度】分开展示导出，我们如果需要将类型展示为  varchar(100)这种格式就可以定义一个函数如下
            def type_len(field, field_dict):
                return filed_dict['type']+'('+filed_dict['length']+')'
    """

    def __init__(self, name, c_name=None, format_fun=default_format_fun):
        self.name = name
        if c_name is None:
            if name == 'name':
                self.c_name = '参数'
            elif name == 'type':
                self.c_name = '类型'
            elif name == 'length':
                self.c_name = '长度'
            elif name == 'nullable':
                self.c_name = '允空'
            elif name == 'desc':
                self.c_name = '注释'
            else:
                self.c_name = '未知参数'
        else:
            self.c_name = c_name
        self.format_fun = format_fun


def export_fields_parser2table_header(fields):
    """
    将导出参数转换为表格表头
    :param fields: 导出函数
    :return: 字符串，表头字符串
    """
    fields_c_names = []
    for field in fields:
        fields_c_names.append(field.c_name)
    headers = '| %s |\n| %s |\n' % (' |'.join(fields_c_names), ' |'.join(['----'] * len(fields)))
    return headers


def export_fields_parser2table_row(field_dict, fields):
    """
    将导出参数转换为表格行数据
    :param field_dict: 某一表的一个字段的所有信息字典
    :param fields: 某一个导出参数
    :return: 返回某一行的导出字符串
    """
    fields_content = []
    for field in fields:
        fields_content.append(str(field.format_fun(field, field_dict)))
    return '| %s |\n' % (' |'.join(fields_content))


# 默认的导出规则
default_export_fields = (ExportField(name='name'), ExportField(name='type'), ExportField(name='length'),
                         ExportField(name='nullable',
                                     format_fun=lambda field, fields_dict: '是' if fields_dict['nullable'] else '否'),
                         ExportField(name='desc'))


def export_md(file_path, data, fields=default_export_fields):
    if fields is None:
        fields = default_export_fields
    with open(file_path, 'w', encoding='utf-8') as file:
        file.write("## 数据库文档\n\n")
        file.write("[TOC]\n\n")
        for table in data:
            table_str = "#### %s%s\n" % (
                table.t_name, "(" + str(table.t_c_name) + ")" if len(str(table.t_c_name)) != 0 else "")
            file.write(table_str)
            file.write(export_fields_parser2table_header(fields))
            for field in table.t_fields:
                field_dict = {
                    "name": field.c_name,
                    "type": field.c_type,
                    "length": field.c_length,
                    "nullable": field.c_nullable,
                    "desc": field.c_desc
                }
                file.write(export_fields_parser2table_row(field_dict, fields))
            file.write("\n\n")
